package com.ic.util;

import com.ic.base.MessageInfo;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.util.Properties;

/**
 * Description: 本类提供上传文件类型、大小的验证方法
 * <p>
 * Author: zen_hu
 * Date  : 2017/1/19
 * Time  : 12:16
 */
public class FileUploadUtil {
	private static final Logger LOGGER = Logger.getLogger(FileUploadUtil.class);

	/**
	 * 验证前端上传的单个图片的类型和大小(按字节)是否满足要求
	 *
	 * @param file       上传文件信息
	 * @param properties 封装上传文件的格式信息
	 * @return 上传文件操作信息，当为null时上传成功
	 */
	public static String checkPicTypeAndSize(MultipartFile file, Properties properties) {
		String fileName = file.getOriginalFilename();
		if (!StringUtil.notNullAndNotBlank(fileName))
			return MessageInfo.CHOOSE_PIC_NOT_BLANK;
		// 验证图片类型
		if (!checkPicType(fileName, properties))
			return MessageInfo.CHOOSE_PIC_WITH_PROPER_TYPE;
		// 验证图片大小
		if (!checkFileSize(file, properties))
			return MessageInfo.CHOOSE_PIC_WITH_PROPER_SIZE;
		return null;
	}

	/**
	 * 验证前端上传的多个图片文件的类型和大小(按字节)是否满足要求
	 *
	 * @param files      上传文件信息
	 * @param properties 封装上传文件的格式信息
	 * @return 上传文件操作信息，当为null时上传成功
	 */
	public static String checkMultiPicTypeAndSize(MultipartFile[] files, Properties properties) {
		String[] fileNames = new String[files.length];
		for (int i = 0; i < files.length; i++) {
			fileNames[i] = files[i].getOriginalFilename();
		}
		if (!StringUtil.notNullAndNotBlank(fileNames))
			return MessageInfo.CHOOSE_PIC_NOT_BLANK;
		// 验证图片类型
		if (!checkMultiPicType(fileNames, properties))
			return MessageInfo.CHOOSE_PIC_WITH_PROPER_TYPE;
		// 验证图片大小
		if (!checkMultiFileSize(files, properties))
			return MessageInfo.CHOOSE_PIC_WITH_PROPER_SIZE;
		return null;
	}

	/**
	 * 验证上传的单个文件是否为图片
	 *
	 * @param fileName   上传文件名称
	 * @param properties 封装上传文件的格式信息
	 * @return 文件类型符合要求返回true，否则为false
	 */
	public static boolean checkPicType(String fileName, Properties properties) {
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		fileType = properties.getProperty("pic.type.prefix") + fileType;
		return (properties.get(fileType) != null);
	}

	/**
	 * 验证上传的所有文件是否都为图片
	 *
	 * @param fileNames  上传文件名称
	 * @param properties 封装上传文件的格式信息
	 * @return 文件类型符合要求返回true，否则为false
	 */
	public static boolean checkMultiPicType(String[] fileNames, Properties properties) {
		String prefix = properties.getProperty("pic.type.prefix");
		for (String fileName : fileNames) {
			String fileType = prefix + fileName.substring(fileName.lastIndexOf("."));
			if (properties.get(fileType) == null)
				return false;
		}
		return true;
	}

	/**
	 * 验证上传的单个文件大小(字节)是否符合要求
	 *
	 * @param file       上传文件信息
	 * @param properties 封装上传文件的格式信息
	 * @return 文件格式符合要求返回true，否则为false
	 */
	public static boolean checkFileSize(MultipartFile file, Properties properties) {
		long fileSize = file.getSize();
		long fileMaxSize = Long.parseLong(properties.getProperty("pic.maxsize"));
		return fileMaxSize >= fileSize;
	}

	/**
	 * 验证上传的文件总大小(字节)是否符合要求
	 *
	 * @param files      上传文件信息
	 * @param properties 封装上传文件的格式信息
	 * @return 文件格式符合要求返回true，否则为false
	 */
	public static boolean checkMultiFileSize(MultipartFile[] files, Properties properties) {
		long fileSize = 0;
		for (MultipartFile file : files) {
			fileSize += file.getSize();
		}
		long fileMaxSize = Long.parseLong(properties.getProperty("pic.maxsize"));
		return fileMaxSize >= fileSize;
	}

	/**
	 * 利用uuid为上传文件生成新文件名
	 *
	 * @param file 上传文件信息
	 * @return 新文件名
	 */
	public static String getFileNewName(MultipartFile file) {
		String fileName = file.getOriginalFilename();
		return KeyGenerateUtil.getInstance().getKey() + fileName.substring(fileName.lastIndexOf("."));
	}

	/**
	 * 利用uuid为上传文件生成新文件名
	 *
	 * @param fileName 上传文件名称
	 * @return 新文件名
	 */
	public static String getFileNewName(String fileName) {
		return KeyGenerateUtil.getInstance().getKey() + fileName.substring(fileName.lastIndexOf("."));
	}
}